#include <iostream>
#include "Dog.h"

using namespace std;

class Person{
public:
	int age = 12;
	//Person(){}
	// 显示定义了 拷贝构造函数 编译器就不会默认生成其他构造函数，必须手动定义
	Person(const Person& person){
		cout << "person() copy init" << endl;
	}
	void say(){
		cout << "person age is " << age << endl;
	}
};

// g++ creat.cpp Dog.cpp -o creat.exe -std=c++11
int main(){
	Dog dog = Dog();
	//Dog dog = Dog(12);
	dog.setName("欢欢");
	dog.age = 23;
	dog.say();
	
	// 匿名对象执行完立即销毁
	Dog(14);
	cout<<"匿名对象测试" << endl;
	// 拷贝构造函数；会使用另外一个对象对创建的对象 进行初始化。拷贝操作是由编译器自动完成的，相当直接对内存进行了拷贝操作；拷贝完了之后 再调用的我们的 拷贝构造函数
	// 拷贝构造函数 默认会有一个 不需要显示 声明就可以用
	Dog dog2(dog);
	//dog2.age = 25;
	dog2.say();
	
	// 隐式调用构造函数
	Dog dog3 = 17;
	Dog dog4;
	cout << "dog4 creation." << endl;
	dog4 = dog3; // 这样是不会调用拷贝构造函数的
	dog4.age = dog4.age + 1;
	Dog dog5 = {19, 2};
	
	dog3.say();
	dog4.say();
	dog5.say();
	
	cout << "person test" << endl;
	// 只有拷贝构造函数时 可以这样写，或者Person p(p); 太骚了，
	// 不理解 为什么 不提供默认空构造函数
	Person p = Person(p);
	p.say();
}